# 判断UI当中是否包含某些部分
# 有些不是股票, 有些股票还没有上市

import cv2
import numpy as np


# 可能会有多个匹配, 返回所有匹配先
def find_all_matches(screen_img, template_img, threshold):
    """获取所有符合阈值的匹配结果，返回列表[(x, y, w, h, 匹配度)]"""
    # # 预处理（使用之前优化的预处理函数）
    # screen_processed = preprocess_image(screen_img)
    # template_processed = preprocess_image(template_img, is_template=True)
    h, w = template_img.shape[:2]
    
    if h == 0 or w == 0:
        return []
    
    # 执行模板匹配并获取匹配度矩阵
    result = cv2.matchTemplate(
        screen_img, 
        template_img, 
        cv2.TM_CCOEFF_NORMED
    )
    # 找到所有超过阈值的位置
    locations = np.where(result >= threshold)
    matches = []
    
    # 遍历所有匹配位置，记录坐标和匹配度
    for y, x in zip(locations[0], locations[1]):
        match_value = result[y, x]  # 该位置的匹配度（0-1）
        matches.append((x, y, w, h, match_value))  # 存储x坐标、y坐标、宽、高、匹配度
    return matches

# 找 模板匹配
def find_template_position(screen_img, template_img, threshold=0.95):
    """
    在屏幕截图中查找模板位置
    :param screen_img: 全屏截图（BGR格式）
    :param template_img: 模板图片（BGR格式）
    :param threshold: 匹配阈值（0-1，越高越严格） 数值为0.8时,还是会有错误, 比如需匹配0.00%,匹配到的却是0.05%
    :return: 匹配区域的左上角坐标(x, y)，若未找到返回None
    """
    # # 获取模板尺寸
    # h, w = template_img.shape[:2]
    
    # # 执行模板匹配
    # result = cv2.matchTemplate(screen_img, template_img, cv2.TM_CCOEFF_NORMED)
    
    # # 查找匹配度超过阈值的位置
    # locations = np.where(result >= threshold)

    # # 取匹配度最高的位置
    # if len(locations[0]) > 0:
    #     # 找到最大匹配值的索引
    #     print("#多个匹配的情况")
    #     max_idx = np.argmax(result)
    #     h_idx, w_idx = np.unravel_index(max_idx, result.shape)
    #     return (w_idx, h_idx, w, h)  # (x, y, 宽, 高)

    all_matches  = find_all_matches(screen_img, template_img,threshold)
    if not all_matches:
        return None  # 无匹配结果
    # 按X坐标升序排序（X越小越靠左），取第一个
    # 若X相同，可选匹配度最高的
    all_matches.sort(key=lambda m: (m[0], -m[1]))  # 优先按X排序，再按y排序 找到左上角的一个叉按钮
    rightmost = all_matches[0]
    return (rightmost[0], rightmost[1], rightmost[2], rightmost[3])  # 返回(x, y, w, h)
    # # 取第一个匹配位置（最相似的）
    # for pt in zip(*locations[::-1]):  # pt为左上角坐标
    #     print("#只有一个匹配的情况")
    #     return (pt[0], pt[1], w, h)  # 返回(x, y, 宽度, 高度)
    
    # return None  # 未找到匹配区域

# 包含筹码按钮, 则返回True
def is_have_button_chip(screen_shot_img):
    try:
        # 确认screen_img的类型
        if not isinstance(screen_shot_img, np.ndarray):
            raise TypeError(f"预期ndarray类型，实际得到{type(screen_shot_img)}")
    except Exception as e:
        # 详细记录错误信息，包括参数类型
        print(f"find_right_of_k_line_area执行失败: {str(e)}")
        print(f"输入参数类型: {type(screen_shot_img)}")
        raise  # 重新抛出异常，让调用方知晓
        
    # 2. 加载模板图片
    template_img = cv2.imread("eastmoney desktop software picture/button_chip_activated_small.png")  # 模板路径
    if template_img is None:
        print("!!!!    ERR 91 模板图片加载失败")
        return False
    
    # 3. 查找模板位置
    target_pos = find_template_position(screen_shot_img, template_img)

    return target_pos is not None

# "右侧边栏2的顶部按钮区"
def is_have_button_trade(screen_shot_img):
    try:
        # 确认screen_img的类型
        if not isinstance(screen_shot_img, np.ndarray):
            raise TypeError(f"预期ndarray类型，实际得到{type(screen_shot_img)}")
    except Exception as e:
        # 详细记录错误信息，包括参数类型
        print(f"find_right_of_k_line_area执行失败: {str(e)}")
        print(f"输入参数类型: {type(screen_shot_img)}")
        raise  # 重新抛出异常，让调用方知晓
    # 2. 加载模板图片
    template_img = cv2.imread("eastmoney desktop software picture/button_trade.png")  # 模板路径
    if template_img is None:
        print("!!!!    ERR 91 模板图片加载失败")
        return False
    # 3. 查找模板位置
    target_pos = find_template_position(screen_shot_img, template_img)
    return target_pos is not None




    
        
